iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 26
0
自我挑戰組

學習 Android Kotlin 隨筆系列 第 26

[ Day 26 ] Java 專案 - Java.Swing 元件心得!

  • 分享至 

  • xImage
  •  

前言

上一篇講解了如何驗證特定的 PC,這篇就延伸這個案子,來看看 Java 的一些 GUI 元件吧!

元件(component)

透過 Java 可以跟 Android 一樣,做到一些 gui 元件的呈現,這在自己寫了 Android 之後,再來寫 JavaSwing 特別有感覺。

以一個 Frame 來講好了,我使用了許多的 JPanel 去當作 ViewGroup 來使用,這專案用到了 JButtonJLabel 等等的小元件,其中想特別記錄一下比較麻煩的元件 JTable

  • JTable

    這個元件需要兩個參數,分別是 headers 以及 data,並且把整個 JTable 包進去 JScrollPane 裡面,才能讓超出畫面的 row 被捲動。
    麻煩事麻煩在想對每個 Item 做客製化動作的時候,需要另外寫一個 instance,去設定 table 的 DefaultTableCellRenderer,如下,我想要在每個 cell 的外框加上一個 border,那就需要透過下面的方法實作出來。

    private static class BorderColorRenderer extends DefaultTableCellRenderer {
       public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
           Border border;
           switch (column) {
               case 1:
                   border = BorderFactory.createMatteBorder(0, 2, 0, 0, Color.BLACK);
                   break;
               case 2:
            	   border = BorderFactory.createLineBorder(new Color(2,2,2,34), 3);
                   break;
           ...
           }
        JComponent comp = (JComponent) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
           comp.setBorder(border);
           return comp;
    }
    

    先透過 BorderFactory 去產生一個 border(有分很多種種類),然後再繼承原先的 cell 的這個 component,之後再去對他做更改。

實作小泥坑

  • 想要刪除 selected row 的藍色背景,該怎刪?

這裡一開始搞蠻久的,因為他的 default 值是一個不太好看的大藍色,當按下某一個 cell ,整條 row 就會變色,想把他移除掉。而一開始一直在 setSelectionBackground 這邊做嘗試,嘗試想要把背景顏色調成透明,又發現 not work。

後來還搭配著點擊背景可以移除裡面 cell 的 focus ,得到以下的解法

  • 在背景的 layout

    this.addMouseListener(new MouseListener() {
    
        ...
    
        @Override
        public void mousePressed(MouseEvent e) {
             JComponent comp = (JComponent) e.getSource();
             comp.requestFocus();
            // TODO Auto-generated method stub
    
        }
    
        ...
    });
    
  • 在這個 table

    table.setRowSelectionAllowed(false);
    

    才知沒辦法從顏色下手,而是要從根本的禁止被選擇,那就不會出現那條藍色背景拉!


上一篇
[ Day 25 ] Java 專案 - 如何正確辨識每台不同的本地 PC
下一篇
[ Day 27 ] Google Drive 自動化上傳資料庫檔案(小筆記)
系列文
學習 Android Kotlin 隨筆30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言